import {SauceLiveJwt} from '/js/live/saucelive-jwt.js'; export class SauceLiveManager { constructor() { this.jwtManager = new SauceLiveJwt(); // 인스턴스 생성 this.setupEventListeners(); } // 수정된 start 함수 startLive(broadcastId, returnUrl) { //broadcastId가 존재하는지 확인 if (!broadcastId) { console.error('start 함수에 broadcastId 파라미터가 필요합니다.'); return; } let url; if (!window.UIPage.server.isProduct) { url = 'https://stage.player.sauceflex.com/broadcast/'; } else { url = 'https://player.sauceflex.com/broadcast/'; } const loginYn = window.UIPage.isLogin; // 환경 감지 console.log('broadcastId:', broadcastId, 'loginYn:', loginYn, 'returnUrl:', returnUrl); const environment = this.detectEnvironment(); console.log('SauceLiveLib 시작 환경:', environment); if (environment === 'app' && this.isAppVersionCompatible()) { //App 환경 this.startInAppLiveBroadcast(loginYn, broadcastId, returnUrl); } else { // 모바일 웹 브라우저 또는 PC 환경 this.redirectSauceLiveBroadcast(loginYn, url, broadcastId, returnUrl); } } compareVersions(v1, v2) { const v1parts = v1.split('.').map(Number); const v2parts = v2.split('.').map(Number); const len = Math.max(v1parts.length, v2parts.length); for (let i = 0; i < len; i++) { const a = v1parts[i] || 0; const b = v2parts[i] || 0; if (a > b) return 1; if (a < b) return -1; } return 0; } isAppVersionCompatible() { const appName = window.UIPage.appName; const appVersion = window.UIPage.appVersion; const appVersionRequirements = { elandmall: '8.1.0', kidikidi: '7.2.2' }; const requiredVersion = appVersionRequirements[appName]; if (requiredVersion) { return this.compareVersions(appVersion, requiredVersion) > 0; } return false; } startInAppLiveBroadcast(loginYn, broadcastId, returnUrl) { if (loginYn === 'Y') { this.jwtManager.getJwt().then((jwt) => { if (jwt) { this.invokeFlutterHandler({"address": broadcastId, "token": jwt, "return_url": returnUrl}); } else { this.invokeFlutterHandler({"address": broadcastId, "return_url": returnUrl}); } }).catch((error) => { if (error) { console.error('JWT 가져오기 오류:', error); } this.invokeFlutterHandler({"address": broadcastId}); }); } else { console.log('비로그인 사용자 jwt 없이 SauceLive 방송시작'); this.invokeFlutterHandler({"address": broadcastId}); } console.log('앱 환경에서 Flutter 실행'); } invokeFlutterHandler(params = {}) { window.flutter_inappwebview.callHandler( 'baseEventHandler', "startSauceLiveScreen", params ).then(function (result) { console.log('Flutter 핸들러 호출 성공:', result); }).catch(function (error) { console.error('Flutter 핸들러 호출 오류:', error); }); } redirectSauceLiveBroadcast(loginYn, url, broadcastId, returnUrl) { // 모바일 웹 브라우저 또는 PC 환경 if (loginYn === 'Y') { this.jwtManager.getJwt().then((jwt) => { // SauceLiveLib URL 구성 let sauceUrl = url + `${encodeURIComponent(broadcastId)}?returnUrl=${encodeURIComponent(returnUrl)}`; if (jwt) { sauceUrl += `&accessToken=${encodeURIComponent(jwt)}`; } console.log('SauceLiveLib URL로 새 창 열기:', sauceUrl); // 새 창으로 SauceLiveLib 로드 window.location.href = sauceUrl; }).catch((error) => { console.error('JWT 가져오기 오류:', error); // JWT를 가져오지 못한 경우 accessToken 없이 새 창으로 로드 const sauceUrl = url + `${encodeURIComponent(broadcastId)}`; console.log('accessToken 없이 SauceLiveLib URL로 새 창 열기:', sauceUrl); window.location.href = sauceUrl; }); } else { // 로그인하지 않은 경우 const sauceUrl = url + `${encodeURIComponent(broadcastId)}`; console.log('accessToken 없이 SauceLiveLib URL로 새 창 열기:', sauceUrl); window.location.href = sauceUrl; } } // 이벤트 리스너 설정 setupEventListeners() { window.addEventListener("message", async (e) => { if (typeof e.data !== "string") return; try { const jsonData = JSON.parse(e.data); const handlerName = jsonData.key; const params = jsonData.params || {}; switch (handlerName) { case "sauceflexEnter": case "sauceflexMoveExit": case "sauceflexMoveLogin": case "sauceflexMoveProduct": case "sauceflexMoveBanner": case "sauceflexOnShare": case "sauceflexMoveReward": case "sauceflexBroadcastStatus": await Flutter.flutterBaseCall(handlerName, params); break; default: console.warn("Unknown message key:", handlerName); break; } } catch (error) { console.error("Error parsing message data:", error); } }); } detectEnvironment() { // Flutter에서 전달한 환경 정보가 있는지 확인 if (typeof window.environment !== 'undefined') { console.log('Environment set by Flutter:', window.environment); if (window.environment === 'app') { return 'app'; } } const userAgent = navigator.userAgent || navigator.vendor || window.opera; const lowerUserAgent = userAgent.toLowerCase(); const isMobileDevice = /android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(lowerUserAgent); // Android WebView 감지 const isAndroidWebView = /wv/.test(userAgent) || (/Android/.test(userAgent) && /Version\/[\d.]+/i.test(userAgent)); // iOS WebView 감지: Safari가 아닌 경우에만 WebView로 간주 const isIOS = /iPad|iPhone|iPod/.test(userAgent) && !window.MSStream; const isiOSWebView = isIOS && !/safari/i.test(userAgent); console.log('User Agent:', userAgent); console.log('isMobileDevice:', isMobileDevice); console.log('isAndroidWebView:', isAndroidWebView); console.log('isiOSWebView:', isiOSWebView); if (isAndroidWebView || isiOSWebView) { return 'app'; // 앱(WebView) 환경 } else if (isMobileDevice) { return 'mobileWeb'; // 모바일 웹 브라우저 환경 } else { return 'pc'; // PC 웹 브라우저 환경 } } // 네이티브에서 데이터를 받는 함수 receiveDataFromFlutter(data) { document.getElementById('messageFromFlutter').innerText = data; // 필요 시 네이티브로 다시 데이터 전송 flutterBaseCall('receiveDataFromFlutter', {data: data}); } } window.SauceLiveManager = SauceLiveManager;